package com.aizuda.boot.modules.business.permission.domain.entity;

import com.aizuda.boot.modules.common.constant.enums.ContractScopeTypeEnums;
import com.aizuda.boot.modules.common.constant.enums.DataType;
import com.aizuda.boot.modules.common.constant.enums.PermissionStatusType;
import com.aizuda.boot.modules.common.constant.enums.ValidityType;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

/**
 * @author duanyao
 * @date 2022/12/05 14:07
 * @description: 角色数据权限表
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("auth_role_data_isolation")
public class RoleDataIsolationEntity implements Serializable {

    private static final long serialVersionUID = 623846598263451L;

    @TableId(value = "permission_id", type = IdType.AUTO)
    @Schema(description = "权限id")
    private Long permissionId;

    /**
     * 权限名称，用于描述权限作用
     */
    @Schema(description = "权限名称，用于描述权限作用")
    private String permissionName;

    /**
     * 角色id
     */
    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    @Schema(description = "角色ID")
    private Long roleId;

    /**
     * 关联的用户ID，为空则表示按角色或部门配置
     */
    @Schema(description = "关联的用户ID，为空则表示按角色或部门配置，多个逗号隔开")
    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    private String userId;

    /**
     * 部门id,多个部门用"，"隔开
     */
    @Schema(description = "关联的部门ID，为空则表示按角色或用户配置，多个逗号隔开")
    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    private String departmentId;

    /**
     * 授权有效期
     */
    @Schema(description = "授权有效期类型")
    private ValidityType validityType;

    /**
     * 授权有效期开始时间
     */
    @Schema(description = "授权有效期开始时间")
    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    private Date validityStartDate;

    /**
     * 授权有效期结束时间
     */
    @Schema(description = "授权有效期结束时间")
    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    private Date validityEndDate;

    /**
     * 权限控制的数据类型
     */
    @Schema(description = "权限控制的数据类型")
    private DataType dataType;

    /**
     * 权限控制的合同数据范围
     */
    @Schema(description = "权限控制的合同数据范围")
    private ContractScopeTypeEnums contractScope;

    /**
     * 是否使用自定义条件
     */
    @Schema(description = "是否使用自定义条件")
    private Boolean useCustomCondition;


    /**
     * 权限状态
     */
    @Schema(description = "权限状态")
    private PermissionStatusType permissionStatus;

    @Schema(description = "权限内容")
    private String content;

    /**
     * 创建时间
     */
    @Schema(description = "创建时间")
    private Date createdAt;

    /**
     * 更新时间
     */
    @Schema(description = "更新时间")
    private Date updatedAt;

    /**
     * 数据权限id
     */
//    @TableId(value = "id", type = IdType.AUTO)
    @Schema(description = "数据权限id")
    @TableField(exist = false)
    private Long id;


    /**
     * 雇员ID
     */
    @Schema(description = "雇员ID")
    @TableField(exist = false)
    private Long employeeId;

    /**
     * 菜单id (仅仅是功能，不能是操作)
     */
    @Schema(description = "菜单id (仅仅是功能，不能是操作)")
    @TableField(exist = false)
    private Long menuId;

    /**
     * 数据隔离级别；本人:ONSELF（1），本部门:ONSELF_DEPARTMENT（1），本部门及下属:DEPARTMENT（*），指定部门:APPOINT（*），所有部门:ALL（1），自定义:CUSTOME（*）
     */
    @TableField(exist = false)
    @Schema(description = "数据隔离级别；本人:ONSELF（1），本部门:ONSELF_DEPARTMENT（1），本部门及下属:DEPARTMENT（*），指定部门:APPOINT（*），所有部门:ALL（1），自定义:CUSTOME（*）")
    private String dataIsolationLevel;

    /**
     * 数据访问部门ROOT（散点或根）
     */
    @Schema(description = "数据访问部门ROOT（散点或根）")
    @TableField(exist = false)
    private String appointDepartmentId;

    /**
     * 自定义逻辑字段，仅对标识自定义:CUSTOME 有效
     */
    @Schema(description = "自定义逻辑字段，仅对标识自定义:CUSTOME 有效")
    @TableField(exist = false)
    private String customeStr;
}